package sy.dao.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 基础数据库操作接口
 * 
 * @author 孙宇
 * 
 * @param <T>
 * @param <PK>
 */
public interface BaseDaoI<T extends Serializable, PK extends Serializable> {

	/**
	 * 获得一个对象
	 * 
	 * @param clazz
	 *            对象的类型
	 * @param pk
	 *            主键
	 * @return
	 */
	T get(Class<T> clazz, PK pk);

	/**
	 * 保存一个对象
	 * 
	 * @param o
	 * @return
	 */
	T save(T o);

	/**
	 * 更新一个对象
	 * 
	 * @param o
	 * @return
	 */
	T update(T o);

	/**
	 * 保存或更新一个对象
	 * 
	 * @param o
	 * @return
	 */
	T saveOrUpdate(T o);

	/**
	 * 删除一个对象
	 * 
	 * @param o
	 */
	void delete(T o);

	/**
	 * 查找一个对象
	 * 
	 * @param hql
	 * @return
	 */
	T find(String hql);

	/**
	 * 查找一个对象
	 * 
	 * @param hql
	 * @param params
	 *            参数
	 * @return
	 */
	T find(String hql, Map<String, Object> params);

	/**
	 * 查找所有对象
	 * 
	 * @param hql
	 * @return
	 */
	List<T> findAll(String hql);

	/**
	 * 查找所有对象
	 * 
	 * @param hql
	 * @param params
	 *            参数
	 * @return
	 */
	List<T> findAll(String hql, Map<String, Object> params);

	/**
	 * 查找所有对象带分页
	 * 
	 * @param hql
	 * @param page
	 *            要查找第几页
	 * @param rows
	 *            每页显示记录数
	 * @return
	 */
	List<T> findAll(String hql, Integer page, Integer rows);

	/**
	 * 查找所有对象带分页
	 * 
	 * @param hql
	 * @param params
	 *            参数
	 * @param page
	 *            要查找第几页
	 * @param rows
	 *            每页显示记录数
	 * @return
	 */
	List<T> findAll(String hql, Map<String, Object> params, Integer page, Integer rows);

	/**
	 * 统计总数
	 * 
	 * @param hql
	 * @return
	 */
	Long total(String hql);

	/**
	 * 统计总数
	 * 
	 * @param hql
	 * @param params
	 *            参数
	 * @return
	 */
	Long total(String hql, Map<String, Object> params);

}
